﻿/*
 * Сделано в SharpDevelop.
 * Пользователь: CrMosk
 * Дата: 10.05.2013
 * Время: 13:52
 * 
 * Для изменения этого шаблона используйте Сервис | Настройка | Кодирование | Правка стандартных заголовков.
 */
using System;
using System.IO;

namespace Region.Utils
{
  public partial class Compression
  {
    /// <summary>
    /// Если буфер Source сжат GZ то возвращается разжатые данные иищаче исходные
    /// </summary>
    /// <param name="Source">буфер с исходными данными</param>
    /// <returns></returns>
    public static byte[] DecodeGZ(byte[] Source)
    {
      if (Source[0] == 31 && Source[1] == 139)//Данные сжаты gz их необходимо разжать перед использованием
      {
        MEMStream mem = new MEMStream(Source);
        var gz = new System.IO.Compression.GZipStream(mem, System.IO.Compression.CompressionMode.Decompress);
        byte[] AllBuff = new byte[0];
        byte[] ReadBuff = new byte[1024 * 1024];
        Int32 Size = 0;
        while (true)
        {
          Int32 readSize = gz.Read(ReadBuff, Size, ReadBuff.Length);
          if(readSize<=0) 
            break;
          byte[] NewAllBuff = new byte[Size + readSize];
          Array.Copy(AllBuff, 0, NewAllBuff, 0, Size);
          Array.Copy(ReadBuff, 0, NewAllBuff, Size, readSize);
          AllBuff = NewAllBuff;                    
        }
        Source = AllBuff;
      }
      return Source;
    }
    public static Stream DecodeGZ(Stream Source)
    {
      Source.Seek(0, SeekOrigin.Begin);
      if (Source.ReadByte() == 31 && Source.ReadByte() == 139)//Данные сжаты gz их необходимо разжать перед использованием
      {
        Source.Seek(0, SeekOrigin.Begin);        
        Source = new System.IO.Compression.GZipStream(Source, System.IO.Compression.CompressionMode.Decompress);        
      }
      return Source;
    }

  }
}
